/*
 * Refer to the following URL which describes the programming specification for this file:
 * wiki goes here
 * 
 * TODO: Print out root directory (/usr/lib/carblogger_ui) to log file in /var.
 */

#include "IndexHTML.hpp"
#include <Wt/WServer>

#include <vector>
using namespace std;
#include <Wt/WApplication> // temp testing
#include "utilities.hpp"

#include <Wt/WVBoxLayout>
#include <Wt/WHBoxLayout>
#include "ControlButton.hpp"
#include <Wt/WGridLayout>
#include <Wt/WTextArea>
#include <Wt/WSlider>
#include <iostream>

// class foo : public Wt::WHBoxLayout
// {
// public:
// //     foo()
// //         :
// //     {
// //         //BEGIN Main layout
// //         Wt::WHBoxLayout* canvas = new Wt::WHBoxLayout(app->root());
// //         canvas->setContentsMargins(30, 30, 30, 30); // Add space around all four sides.
// //         canvas->addWidget(left_side_border);
// //         canvas->addLayout(right_side_layout);
// //     }
// };





int main(int argc, char *argv[])
{
    return 1;
    // Intercept argc and argv so I can make some required arguments, optional.      
    utilities::ModifiedArgv modified_argv(argc, argv);
    
    try
    {        
        Wt::WServer server(argv[0]);

        server.setServerConfiguration(modified_argv.getArgsSize(), modified_argv.getArgs(), WTHTTP_CONFIGURATION);
        
        /**
         * Add a resource here. i.e.
         * server.addResource(&rssFeed, "/wt/blog/feed/");
         */

        /*
         * Trying to make it possible to expand on this appliction:
         *  + Create a new entry point when needed.
        */
        server.addEntryPoint(Wt::Application,
                             /*
                              * Use a lambda function to reduce some code.
                              */
                             [=](const Wt::WEnvironment& env) -> Wt::WApplication*
                             {
                                 Wt::WApplication* app = new Wt::WApplication(env);
                                 
                                 /*
                                  * Externalizing css to help development. When the decoration stops changing,
                                  * it would be good to inline the css.
                                 */
                                 utilities::loadStylesheet("/css/global.css"); 
                                 
                                 // And here's how to do it inline.
                                  //Wt::WApplication::instance()->styleSheet().addRule("body, html",
                                  //                                                   "margin: 0px;"
                                  //                                                   "padding:0;"
                                  //                                                   "height: 100%;"); 
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~```                                       

//     //BEGIN Make some components to be used later, (in the method that uses app->root()).
//     Wt::WContainerWidget *rectangle = new Wt::WContainerWidget;
//     rectangle->setStyleClass("rectangle");
//     Wt::WApplication::instance()->styleSheet().addRule(".rectangle",
//                                                 "border-color: green;"
//                                                 "border-width: thick;"
//                                                 "border-style: ridge;");
//     
//     Wt::WContainerWidget *context_buttons = new Wt::WContainerWidget;
//     context_buttons->setStyleClass("context_buttons");
//     Wt::WApplication::instance()->styleSheet().addRule(".context_buttons",
//                                                 "border-color: blue;"
//                                                 "border-width: thick;"
//                                                 "border-style: ridge;"
//                                                 "max-height: 200px;"
//                                                 "min-height: 200px;"
//                                                 "min-width: 300px;"
//                                                 "max-width: 300px;");
//     
//     Wt::WContainerWidget *control_button = new Wt::WContainerWidget;
//     control_button->setStyleClass("control_button");
//     Wt::WApplication::instance()->styleSheet().addRule(".control_button",
//                                                 "border-color: purple;"
//                                                 "border-width: thick;"
//                                                 "border-style: ridge;"
//                                                 "max-height: 5em;"
//                                                 "min-height: 5em;"
//                                                 "min-width: 5em;"
//                                                 "max-width: 5em;");
//     
//     //BEGIN: Top-left message window
//     Wt::WContainerWidget *gui_message_window = new Wt::WContainerWidget;
//     gui_message_window->setStyleClass("gui_message_window");
//     Wt::WApplication::instance()->styleSheet().addRule(".gui_message_window",
//                                                 "border-color: orange;"
//                                                 "border-width: thin;"
//                                                 "border-style: ridge;");
//     //END: Top-left message window
//     //BEGIN: Bottom-left message window
//     Wt::WContainerWidget *system_message_window = new Wt::WContainerWidget;
//     system_message_window->setStyleClass("system_message_window");
//     Wt::WApplication::instance()->styleSheet().addRule(".system_message_window",
//                                                 "border-color: magenta;"
//                                                 "border-width: thin;"
//                                                 "border-style: ridge;");
//     //END: Bottom-left message window
//     
//     //BEGIN Make a slider to add to the left side border
//     Wt::WSlider *slider = new Wt::WSlider(Wt::Vertical);
//     slider->setMinimum(-4);
//     slider->setMaximum(4);
//     slider->setValue(3);
//     slider->setTickInterval(15);
//     slider->setTickPosition(Wt::WSlider::NoTicks);
//     slider->setWidth("21px"); //set to size of handle icon
//     //END Make a slider to add to the left side border
//     
//     //BEGIN inner-left horizontal splitter
//     Wt::WHBoxLayout* inner_left_splitter = new Wt::WHBoxLayout;  
//     inner_left_splitter->addWidget(gui_message_window);
//     inner_left_splitter->addWidget(system_message_window);
//     //END inner-left horizontal splitter
//     
//     //BEGIN divider for slider area so I can have it go only 50% of the way up.
//     Wt::WVBoxLayout* slider_area = new Wt::WVBoxLayout;
//     slider_area->addStretch(1);
//     slider_area->addWidget(slider, 1);
//     //slider->valueChanged().connect(this, dosomething);
//     //END divider for slider area so I can have it go only 50% of the way up.
//     
//     //BEGIN message area
//     Wt::WVBoxLayout* message_area = new Wt::WVBoxLayout;
//     message_area->addWidget(rectangle);
//     message_area->addWidget(rectangle);
//     //END divider for slider area so I can have it go only 50% of the way up.
//     
//     //BEGIN The big left border that contains the slider and two viewer panes.
//     Wt::WContainerWidget *left_side_border = new Wt::WContainerWidget;
//     left_side_border->setStyleClass("left_side_border");
//     Wt::WApplication::instance()->styleSheet().addRule(".left_side_border",
//                                                 "border-color: brown;"
//                                                 "border-width: thick;"
//                                                 "border-style: ridge;");
//     Wt::WHBoxLayout* left_side_verticle_split = new Wt::WHBoxLayout;  
//     left_side_verticle_split->addLayout(message_area, 1); 
//     left_side_verticle_split->addLayout(slider_area, 0, Wt::AlignmentFlag::AlignRight);
//     left_side_border->setLayout(left_side_verticle_split);
// 
//     //END The big left border that contains the slider and two viewer panes.
//           
//     //BEGIN RIght side, which contains control button and context buttons
//     Wt::WVBoxLayout* right_side_layout = new Wt::WVBoxLayout;                         
//     right_side_layout->addWidget(context_buttons, 0, Wt::AlignmentFlag::AlignRight);
//     right_side_layout->addWidget(new webpages::components::ControlButton, 1, Wt::AlignmentFlag::AlignRight| Wt::AlignmentFlag::AlignBottom);                                 
//     //END RIght side, which contains control button and context buttons
//     
//     //END Make some components to be used later, (in the method that uses app->root()).
//     
//     
//     //BEGIN Main layout
// 
//     Wt::WHBoxLayout* Scene = new Wt::WHBoxLayout(app->root());
//     Scene->setContentsMargins(30, 30, 30, 30); // Add space around all four sides.
//     Scene->addWidget(left_side_border);
//     Scene->addLayout(right_side_layout);
//             
//     
// //BEGIN LATEST
//       new Scene(app->root()); 
// //END LATEST    
    
    
    
    
    
    
    

//NOTE: last working chunk              
// // // // // // // // // // // // // // // // // //BEGIN: (to be used later)
// // // // // // // // // // // // // // // // // // Fixed position, rectangle and slider (aka splitter?),  to control verticle-
// // // // // // // // // // // // // // // // // // lefsideUdjestustment.
// // // // // // // // // // // // // // // // // //        Wt::WContainerWidget *left_view_controller = new Wt::WContainerWidget(app->root());
// // // // // // // // // // // // // // // // // Wt::WContainerWidget *left_view_controller = new Wt::WContainerWidget;
// // // // // // // // // // // // // // // // // left_view_controller->setWidth("100px");
// // // // // // // // // // // // // // // // // left_view_controller->setMinimumSize("200px", "200px");
// // // // // // // // // // // // // // // // // left_view_controller->setStyleClass("left_view_controller");
// // // // // // // // // // // // // // // // // Wt::WApplication::instance()->styleSheet().addRule(".left_view_controller",
// // // // // // // // // // // // // // // // //                                                     "border-color: brown;"
// // // // // // // // // // // // // // // // //                                                     "border-width: thick;"
// // // // // // // // // // // // // // // // //                                                     "border-style: ridge;"
// // // // // // // // // // // // // // // // //                                                     "position: fixed;"
// // // // // // // // // // // // // // // // //                                                     "top:0;"
// // // // // // // // // // // // // // // // //                                                     "left:0;"
// // // // // // // // // // // // // // // // //                                                     "width:100px;"
// // // // // // // // // // // // // // // // //                                                     "height:100px;");
// // // // // // // // // // // // // // // // // 
// // // // // // // // // // // // // // // // // Wt::WSlider *slider = new Wt::WSlider(Wt::Vertical, left_view_controller);
// // // // // // // // // // // // // // // // // slider->setMinimum(-30);
// // // // // // // // // // // // // // // // // slider->setMaximum(30);
// // // // // // // // // // // // // // // // // slider->setValue(0);
// // // // // // // // // // // // // // // // // slider->setTickInterval(10);
// // // // // // // // // // // // // // // // // slider->setTickPosition(Wt::WSlider::TicksBothSides);
// // // // // // // // // // // // // // // // // slider->resize(50, 400);
// // // // // // // // // // // // // // // // // //slider->sliderMoved().connect(this, &PaintExample::rotateShape);

        
// //         left_view_controller->resize();
// //         app->root()->addWidget(left_view_controller);
//         Wt::WSlider *slider = new Wt::WSlider(Wt::Vertical, left_view_controller);
//         slider->setStyleClass("slider");
//                 Wt::WApplication::instance()->styleSheet().addRule(".slider",
//                                                            "border-color: brown;"
//                                                            "border-width: thick;"
//                                                            "border-style: ridge;"
//                                                            "position: fixed;"
//                                                            "top:0;"
//                                                            "left:0;"
//                                                            "width:100px;"
//                                                            "height:100px;");
//         
// //         scaleSlider->setMinimumSize("10px", "100px");
// //         scaleSlider->setNativeControl(true);
// //         scaleSlider->setOrientation(Wt::Orientation::Vertical);
// // scaleSlider->setHeight("100px");        
// // scaleSlider->setHandleWidth("10px");
// //         std::cout << "\n++++++++++++++Orientation: " << scaleSlider->orientation() << std::endl;
//         slider->setMinimum(0);
//         slider->setMaximum(20);
//         slider->setValue(10);
//         slider->setTickInterval(5);
//         slider->setTickPosition(Wt::WSlider::TicksBothSides);
// //         scaleSlider->resize(120, 100);
//         //scaleSlider->valueChanged().connect(this, &ThisClass::scaleShape);
// 
// 
//         // Add the verticle slider
// //         left_view_controller->addWidget(scaleSlider);
//         //END

        
        
                                 
// // // // // Wt::WGridLayout *layout = new Wt::WGridLayout(app->root());
// // // // //     // Simulate fixed size.
// // // // //     webpages::windowboxes::DisplayModeSelectorViewport* vp = new webpages::windowboxes::DisplayModeSelectorViewport(0);
// // // // //     vp->setMaximumSize("200px", "100px");
// // // // //     vp->setMinimumSize("200px", "100px");
// // // // //     vp->resize("200px", "100px");
// // // // // layout->addWidget(new webpages::windowboxes::DisplayModeSelectorViewport(0), 0, 0);   
// // // // // layout->addWidget(vp, 0, 1, Wt::AlignmentFlag::AlignTop | Wt::AlignmentFlag::AlignRight);   
// // // // // layout->addWidget(new webpages::windowboxes::DisplayModeSelectorViewport(0), 1, 0);
// // // // // layout->addWidget(new webpages::components::ControlButton, 1, 1, Wt::AlignmentFlag::AlignBottom | Wt::AlignmentFlag::AlignRight);
// // // // // layout->addWidget(left_view_controller,2,0);

                                
                                 return app;
                             },
                             "",
                             "/resources/icon.ico");
        
        if (server.start())
        {
            Wt::WServer::waitForShutdown();
            server.stop();
            
            return 0;
        }
    }
    catch (Wt::WServer::Exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    catch (std::exception &e)
    {
        std::cerr << "exception: " << e.what() << std::endl;
    }
}






